package com.tulele.vtool.service;

import com.github.pagehelper.PageInfo;
import com.tulele.vtool.model.*;
import com.tulele.vtool.model.combinedEntity.CombinedInvitedVipUserInfo;
import com.tulele.vtool.model.combinedEntity.CombinedLookArticleUserInfo;
import com.tulele.vtool.model.combinedEntity.UserArticleTailSwitchSet;
import me.chanjar.weixin.mp.bean.result.WxMpUser;
import org.apache.catalina.User;
import org.apache.ibatis.annotations.Param;
import org.springframework.scheduling.annotation.Async;

import java.util.List;
import java.util.Map;

public interface IUserInfoService {

    /**
     * 获取用户信息
     * @param userId
     * @return
     */
    UserInfo getUserMainInfo(Integer userId);

    /**
     * 获取用户信息
     * @param userId
     * @return
     */
    UserInfo queryUserMainInfoMine(Integer userId);

    /**
     * 修改用户昵称
     * @param userInfo
     * @return
     */
    int modifyUserNickName(UserInfo userInfo);

    /**
     * 修改用户签名
     * @param userInfo
     * @return
     */
    int modifyUserSignature(UserInfo userInfo);

    /**
     * 修改用户二维码
     * @param userInfo
     * @return
     */
    int modifyUserQrcodeUrl(UserInfo userInfo);

    /**
     * 修改用户海报
     * @param userInfo
     * @return
     */
    int modifyUserBillUrl(UserInfo userInfo);

    /**
     * 分页获取提现
     * @param queryMap
     * @return
     */
    PageInfo<CombinedInvitedVipUserInfo> getInvitedVipUserInfo(Map<String, Object> queryMap);

    /**
     * 查询用户VIP状态
     * @param userId
     * @return
     */
    Integer getUserVipStatus(Integer userId);

    /**
     * 查询查看了文章的用户信息
     * @param queryMap
     * @return
     */
    PageInfo<CombinedLookArticleUserInfo> getLookArticleUserInfo(Map<String, Object> queryMap);

    /**
     * 获取用户基本信息，包括头像、昵称、签名
     * @param userId
     * @return
     */
    UserInfo getUserBaseInfo(Integer userId);

    /**
     * 获取用户账户余额
     * @param userId
     * @return
     */
    Double getUserAccountBalance(Integer userId);

    /**
     * 添加用户信息
     * @param userInfo
     * @return
     */
    int addWxUserInfo(UserInfo userInfo);

    /**
     * 根据openId查询用户状态
     * @param openId
     * @return
     */
    Integer getUserStatusByOpenId(String openId);

    /**
     * 修改微信用户信息
     * @param userInfo
     * @return
     */
    int modifyWxUserInfo(UserInfo userInfo);

    /**
     * 修改用户VIP状态
     * @param userInfo
     * @return
     */
    int modifyUserVipStatus(UserInfo userInfo);

    /**
     * 获取用户推荐人
     * @param userId
     * @return
     */
    Integer getUserReferer(Integer userId);

    /**
     * 更改用户余额
     * @param userInfo
     * @return
     */
    int modifyUserAccountBalance(UserInfo userInfo);

    /**
     * 获取用户openId
     * @param userId
     * @return
     */
    String getUserOpenId(Integer userId);

    Integer addUserOpenIds(UserOpenIds userOpenIds);

    /**
     * 添加用户通知设置信息
     * @param wxNotifyMsgSetInfo
     * @return
     */
    int recordUserNotifySetInfo(WxNotifyMsgSetInfo wxNotifyMsgSetInfo);

    /**
     * 更新用户通知设置消息
     * @param wxNotifyMsgSetInfo
     */
    int updateUserNotifySetInfo(WxNotifyMsgSetInfo wxNotifyMsgSetInfo);

    /**
     * 查询用户微信通知设置
     * @param userId
     * @return
     */
    WxNotifyMsgSetInfo getUserNotifySetInfo(Integer userId);

    /**
     * 修改用户手机号码
     * @param userInfo
     * @return
     */
    int modifyUserTelNum(UserInfo userInfo);

    /**
     * 修改用户的职务
     * @param userInfo
     */
    int modifyUserJobPosition(UserInfo userInfo);

    /**
     * 修改用户的公司
     * @param userInfo
     * @return
     */
    int modifyUserCompany(UserInfo userInfo);

    /**
     * 查询用户关注公众号状态
     * @param userId
     * @return
     */
    Integer getUserConcernStatus(Integer userId);

    /**
     * 查询用户关注公众号状态(根据公众号标识,子库)
     * @param userId
     * @return
     */
    Integer getUserConcernStatus_gzhdbjssq(Integer userId,String gzhCode);

    /**
     * 查询用户关注公众号状态(根据公众号标识,主库)
     * @param userId
     * @return
     */
    Integer getUserConcernStatus_zktdb(Integer userId,String gzhCode);

    /**
     * 通过openId获取用户用户信息
     * @param openId
     * @return
     */
    UserInfo getUserBaseInfoByOpenId(String openId);

    /**
     * 修改提现信息
     * @param userWithdrawLogInfo
     * @return
     */
    int modifyWithdrawInfo(UserWithdrawLogInfo userWithdrawLogInfo);

    /**
     * 获取邀请注册的用户信息
     * @param userId
     * @return
     */
    List<UserInfo> getInvitedUserInfo(int userId);
    //PageInfo<UserInfo> getInvitedUserInfo(int userId, int pageNum, int pageSize);

    /**
     * 获取邀请注册的用户信息 分页(共建获客专用)
     * @param userId
     * @param pageNum
     * @param pageSize
     * @return
     */
    //PageInfo<UserInfo> getInvitedUserInfoPage_gjhkpt(int userId, int pageNum, int pageSize);
    /**
     * 获取邀请注册的用户信息 递归用(共建获客专用)
     * @param userId
     * @return
     */
    List<UserInfo> getInvitedUserInfo_gjhkpt(int userId);

    /**
     * 分页获取
     * @param lookUserId
     * @param pageNum
     * @param pagSize
     * @return
     */
    List<UserInfo> getInvitedUserInfobyPage(Integer lookUserId, Integer pageNum, Integer pagSize);

    /**
     * 获取邀请的注册用户数
     * @param userId
     * @return
     */
    Integer getInvitedRegUserCount(Integer userId);

    /**
     * 查询用户有效的通知频率设置开关
     * @param userId
     * @return
     */
    Integer getUserValidNotifySetStatus(Integer userId);

    /**
     * 查询用户订阅时间相关信息
     * @param userId
     * @return
     */
    UserInfo getUserSubTimeRelationInfo(Integer userId);

    /**
     * 修改用户头像
     * @param userInfo
     * @return
     */
    int modifyUserAvatar(UserInfo userInfo);





    /**
     * 根据unionId和开放平台分组标识查询当前激活的记录
     * @param userId
     * @param wxUnionId
     * @param openGroupCode
     * @return
     */
    UserInfo queryUserByUnionId(Integer userId,
                                String wxUnionId,
                                String openGroupCode);

    /**
     * 根据unionId和开放平台分组标识，激活对应的用户(即替换ID)
     * @param userId
     * @param actUserId
     * @param wxUnionId
     * @param openGroupCode
     * @return
     * */
    int activateUserByUnionId(Integer userId,
                               Integer actUserId,
                               String wxUnionId,
                               String openGroupCode);


    /**
     * 根据unionId和开放平台分组标识，禁用所有用户记录
     * @param userId
     * @param cancelUserId
     * @param wxUnionId
     * @param openGroupCode
     * @return
     * */
    int cancelUserByUnionId(Integer userId,
                            Integer cancelUserId,
                            String wxUnionId,
                            String openGroupCode);

    /**
     * 根据unionId和开放平台分组标识，修改禁用的用户记录
     * @param userId
     * @param replaceUserId
     * @param wxUnionId
     * @param openGroupCode
     * @return
     * */
    int replaceUserByUnionId(Integer userId,
                            Integer replaceUserId,
                            String wxUnionId,
                            String openGroupCode);

    List<UserInfo> getNotVipUsers(String gzhCode);

    List<UserInfo> getNotReferer(String gzhCode);

    List<UserInfo> queryByNickName(String gzhCode, String nickName);

    List<UserInfo> queryWantedByNickName(String nickName);

    boolean updateUserBillByUserId(Integer userId);

    boolean updateUserQrCodeByUserId(Integer userId);

    //拉黑
    int setBlockState(Integer userId);

    /**
     * 20200601 yl
     * 人脉广场分页查询用户
     * @param
     * @param
     * @return
     */
    List<UserInfo> selectUserList(Integer pageNum, Integer pageSize,Integer userId,String gzhCode,String[] screen,List<Integer> needIds,List<Integer> articleTypeIds);

    String selectRegionByUserId(Integer userId);

    Integer selectCountRegionByUserId(Integer userId);

    void addRegionByUserId(Integer userId, UserRegionInfo userRegionInfo, String gzhCode);

    void addRegion( UserRegionInfo userRegionInfo);

    List<UserInfo> selectUserListByRandom(Integer pageNum, Integer pageSize,Integer userId,String gzhCode,String[] screen,List<Integer> needIds,List<Integer> articleTypeIds,Integer standardUserById);

    Integer selectStandardUserIdByCreationTimeDesc();

    /**
     * 更新人脉广场最后活跃时间
     * @param userId
     * @return
     */
    boolean updateLastConActiveTimeByUserId(Integer userId);

    /**
     * 获取用户信息
     * @param userId
     * @return
     */
    UserInfo getUserInfo(Integer userId);

    int blockLinkByUser(Integer userId, Integer blockLinkType);

    Integer getCardStyle(Integer userId);

    boolean setCardStyle(Integer userId, Integer cardStyle);

    @Async
    UserInfo getUserByImg(String gzhCode,String nickName, String imgPath,Integer targetUserId) throws Exception;

    void copyUserInfo(UserInfo formerUser,UserInfo targetUser);

    Integer updateUserIdByUnionId(WxMpUser userWxInfo, Integer finalUserId, String souGzhCode, String trgGzhCode);

    UserInfo queryUserByUnionIdAndGzhCode2(String unionId, String gzhCode);

    /**
     * 查询用户是否满足: 分会员且文章分享数大于等于5 的条件，
     * 如果满足条件，则显示开通会员；否则，不显示
     * @param userId
     * @return
     */
    Integer showVipByUserId(Integer userId);

    int getUserCountByGzhCode(String gzhCode);

    List<UserInfo> getUserInfoByGzhCode(String gzhCode, int offset, int pageSize);

    List<UserInfo> getUserInfoByGzhCode2(String gzhCode);

    int updateOpenidByUserId(Integer userId, String newOpenId);

    int updateOpenidByOpenId(String oldOpenId, String newOpenId);

    int updateUserGroupOpenId(String gzhCode, String oldOpenId, String newOpenId);

    int updateOpenidByGzhCode(String gzhCode, String oriOpenid, String newOpenid);

    String getUserVipLevel(Integer userId);

    /**
     * 我的团队的成员数量
     * 这里的团队是指用户推荐关系的树状结构
     * @return
     */
    int getUserTeamMemberCount(String gzhCode);

    /**
     * 获取用户的拉黑状态
     * @param userId 用户 ID
     * @return 用户的拉黑状态(0-未拉黑 1-已拉黑)
     */
    int getUserBlockState(Integer userId);

    /**
     * 记录用户访问拉黑页面
     * @param userId 用户 ID
     * @param gzhCode 公众号标识
     */
    void recordAccessBlockPage(Integer userId, String gzhCode);

    /**
     * 用户的直接下级数量
     * @param userId
     * @return
     */
    int getSubordinateCount(Integer userId);

    /**
     * 公众号已关注的用户且用户推广级别为总监的用户ID列表
     * @param gzhCode
     * @return
     */
    List<Integer> getFirstLevelUser(String gzhCode);

    /**
     * 公众号已关注的用户且用户推广级别为经理的用户ID列表
     * @param gzhCode
     * @return
     */
    List<Integer> getSecondLevelUser(String gzhCode);

    /**
     * 获取用户团队会员人数
     * @param gzhCode
     * @param userIds
     * @return
     */
    int getVipUserCount(String gzhCode, List<Integer> userIds);

    /**
     * 获取用户团队非会员人数
     * @param gzhCode
     * @param userIds
     * @return
     */
    int getUnVipUserCount(String gzhCode, List<Integer> userIds);

    /**
     * 获取用户的下级列表
     * @param userId
     * @return
     */
    List<UserInfo> getUserSubUserList(Integer userId, String nickName);

    /**
     * 查询用户个人中心的广告和表格设置开关
     * @param userId 用户 ID
     * @return
     */
    UserArticleTailSwitchSet getUserArticleTailSwitchSet(Integer userId);

    /**
     * 修改用户个人中心的广告和表格设置开关
     * @param userId 用户 ID
     * @param userArticleTailSwitchSet 开关信息
     * @return 影响行数
     */
    int updateUserArticleTailSwitchSet(Integer userId, UserArticleTailSwitchSet userArticleTailSwitchSet);
}
